package mysqlmodel

import (
	"encoding/json"
	"fmt"
	"time"

	"gorm.io/gorm"
)

type ReviewStatus uint8

// 2. 定义常量对应枚举值（与 GORM 注释中的 1/2/3 对应）
const (
	// ReviewStatusPending 待审核（状态值 1）
	ReviewStatusPending ReviewStatus = 1
	// ReviewStatusApproved 已审核（状态值 2）
	ReviewStatusApproved ReviewStatus = 2
	// ReviewStatusRejected 已拒绝絕（状态值 3）
	ReviewStatusRejected ReviewStatus = 3
)

func (s *ReviewStatus) UnmarshalJSON(data []byte) error {
	var statusStr string
	if err := json.Unmarshal(data, &statusStr); err != nil {
		return err
	}
	// 根据字符串反推枚举值
	switch statusStr {
	case "待审核":
		*s = ReviewStatusPending
	case "已审核":
		*s = ReviewStatusApproved
	case "已拒绝":
		*s = ReviewStatusRejected
	default:
		return fmt.Errorf("无效的审核状态: %s", statusStr)
	}
	return nil
}

type ReviewInfo struct {
	ID uint `gorm:"primaryKey,autoIncrement"`
	// 默认可以为空，非空，要显示设置；
	UserID uint `gorm:"comment:创建方表示;not null"`
	// varchar(512) 这里的 512是字符数，不是字节数，这里能存 512个汉字
	Content        string         `gorm:"type:varchar(512);comment:评论内容;not null"`
	ShopID         uint           `gorm:"comment:店铺ID;not null"`
	ShopScore      uint8          `gorm:"type:tinyint(4);comment:商家评分;not null"`
	LogisticsScore uint8          `gorm:"type:tinyint(4);comment:物流评分;not null"`
	HavePicture    bool           `gorm:"not null;comment:是否有图片,默认没有,有的话,去ReviewImage表中查询"`
	Status         ReviewStatus   `gorm:"type:tinyint(4);comment:审核状态,1:待审核,2:已审核,3:已拒绝;not null;default:0"`
	OptIdea        string         `gorm:"type:varchar(216);comment:审核建议,如果拒绝，写拒绝的原因;not null"`
	CreatedAt      time.Time      `gorm:"comment:创建时间,自动生成"`
	UpdatedAt      time.Time      `gorm:"comment:更新时间,自动生成"`
	DeletedAt      gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}

// 用于执行 mino中的 url
type ReviewImage struct {
	ID uint `gorm:"primaryKey,autoIncrement"`
	// 评论和评论回复图片都要存储，所以这里要区分
	// 在查询过程中，如果差图片，肯定要指定实体类型，所有创建联合索引，更合理
	// gorm中，两个字段使用同一个索引名将创建复合索引
	// 优先级 priority 定义，在查询过程中，先根据实体类型查询，再根据实体ID查询
	EntityType uint8          `gorm:"index:idx_type_review_id,priority:1;type:tinyint(4);comment:实体类型,1:订单,2:评价"`
	EntityID   uint           `gorm:"index:idx_type_review_id,priority:2;comment:评论ID,用于关联ReviewInfo,创建索引"`
	URL        string         `gorm:"type:varchar(256);comment:图片URL"`
	CreatedAt  time.Time      `gorm:"comment:创建时间,自动生成"`
	UpdatedAt  time.Time      `gorm:"comment:更新时间,自动生成"`
	DeletedAt  gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}

// 回复评论的列表
type ReviewReployInfo struct {
	ID          uint           `gorm:"primaryKey,autoIncrement"`
	ReviewID    uint           `gorm:"index:idx_review_id;comment:评论ID,用于关联ReviewInfo,创建索引"`
	Content     string         `gorm:"type:varchar(512);comment:评论内容;not null"`
	HavePicture bool           `gorm:"not null;comment:是否有图片,默认没有,有的话,去ReviewImage表中查询"`
	Status      uint8          `gorm:"comment:审核状态,1:待审核,2:已审核,3:已拒绝;not null;default:0"`
	CreatedAt   time.Time      `gorm:"comment:创建时间,自动生成"`
	UpdatedAt   time.Time      `gorm:"comment:更新时间,自动生成"`
	DeletedAt   gorm.DeletedAt `gorm:"index;comment:逻辑删除"`
}
